const Koa = require('koa')
const Router = require('koa-router')
const Swig = require('koa-swig')
const co = require('co')
const koaStaticCache = require('koa-static-cache') // 静态文件处理
const bodyParse = require('koa-bodyparser')  // 处理body请求参数解析

const app = new Koa()

// 处理静态文件
app.use(koaStaticCache('./static', {
  prefix: '/static',
  gzip: true
}))

// 处理post请求提交的数据
app.use(bodyParse({
  
}))

const router = new Router()

/*
存储所有的任务数据
当前这个数据是存储在服务器运行中的内存中，当服务器重启时，数据还是这三个，
*/
let datas = {
  maxId: 3,
  appName: 'todolist22',
  tasks : [
    {id: 1, title: '测试任务1', done: true},
    {id: 2, title: 'koa学习', done: false},
    {id: 3, title: '数据库学习', done: true},
  ]
}

// 设置模板引擎
app.context.render = co.wrap(Swig({
  root: __dirname + '/views',
  autoescape: true,// 自动识别解析文件格式，是否html编码，一般不开启，设置为true
  cache: false,
  // cache: false, // memory: 把解析后的结果保存在内存中，避免每次访问都会去解析模板，影响性能，这样的话数据的改变会变化，但是模板不会变化，这种模式只利于上线
  ext: 'html'
}))

router.get('/', async (ctx, next) => {
  ctx.body = await ctx.render('index.html', {
    datas
  })
})

//  
router.get('/add', async (ctx, next) => {
  ctx.body = await ctx.render('add.html', {
    datas
  })
})

router.post('/posttask', async (ctx, next) => {
  // querystring与当前请求的方式是没有关系的，无论是get还是post，querystring
  // 都可以传递数据，querystirng与get没有关系
  // let title = ctx.query.title // get

  // get方式不能操作正文，body传参。
  let title = ctx.request.body.title || '' // post
  console.log(title);
  if(!title) {
    await ctx.render('message', {
      title: '请您输入任务标题',
      href: 'javascript:history.back();'
    })
    return
  } else {
    datas.tasks.push({
      title: title,
      id: ++datas.maxId,
      done: false
    })
    await ctx.render('message', {
      title: '添加成功',
      href: '/'
    })
  }
  
})

router.get('/change/:id', (ctx, next) => {
  ctx.body = '改变状态todolist'
})

router.get('/remove/:id', (ctx, next) => {
  ctx.body = '移除todolist'
})

// 把路由对象挂载到app中
app.use(router.routes())

app.listen('80')